home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / program / svgacc25.zip / SVGADEM1.C < prev    next >
C/C++ Source or Header  |  1997-03-24  |  38KB  |  1,443 lines

  1. /****************************************************************************
  2.  
  3.       'SVGACC' A Super Vga Graphics Library for use with Microsoft compatible
  4.       C/C++ compilers
  5.       Copyright 1993-1997 by Stephen L. Balkum and Daniel A. Sill
  6.  
  7.     **************** UNREGISTERD SHAREWARE VERSION ***********************
  8.     * FOR EVUALATION ONLY. NOT FOR RESALE IN ANY FORM. SOFTWARE WRITTEN  *
  9.     * USING THIS UNREGISTERED SHAREWARE GRAPHICS LIBRARY MAY NOT BY SOLD *
  10.     * OR USED FOR ANY PURPOSE OTHER THAN THE EVUALTION OF THIS LIBRARY.  *
  11.     **********************************************************************
  12.  
  13.     **************** NO WARRANTIES AND NO LIABILITY **********************
  14.     * Stephen L. Balkum and Daniel A. Sill provide no warranties, either *
  15.     * expressed or implied, of merchantability, or fitness, for a        *
  16.     * particular use or purpose of this SOFTWARE and documentation.      *
  17.     * In no event shall Stephen L. Balkum or Daniel A. Sill be held      *
  18.     * liable for any damages resulting from the use or misuse of the     *
  19.     * SOFTWARE and documentation.                                        *
  20.     **********************************************************************
  21.  
  22.     ************** U.S. GOVERNMENT RESTRICTED RIGHTS *********************
  23.     * Use, duplication, or disclosure of the SOFTWARE and documentation  *
  24.     * by the U.S. Government is subject to the restictions as set forth  *
  25.     * in subparagraph (c)(1)(ii) of the Rights in Technical Data and     *
  26.     * Computer Software cluse at DFARS 252.227-7013.                     *
  27.     * Contractor/manufacturer is Stephen L. Balkum and Daniel A. Sill,   *
  28.     * P.O. Box 7704, Austin, Texas 78713-7704                            *
  29.     **********************************************************************
  30.  
  31.     **********************************************************************
  32.     * By using this SOFTWARE or documentation, you agree to the above    *
  33.     * terms and conditions.                                              *
  34.     **********************************************************************
  35.  
  36.  ***************************************************************************/
  37.  
  38. #define MODULE
  39.  
  40. #include <stdio.h>
  41. #include <conio.h>
  42. #include <stdlib.h>
  43. #include <malloc.h>
  44. #include <string.h>
  45. #include <math.h>
  46.  
  47. #include "svgacc.h"
  48. #include "svgademo.h"
  49.  
  50. #define randnum(size) (rand() % (int)(size))
  51.  
  52. /***********
  53.  * DOBLOCK *
  54.  ***********/
  55.  
  56. char doblock(void)
  57. {
  58.     int i, colr;
  59.     int xinc, yinc, x1, y1, x2, y2;
  60.     int cntx, cnty;
  61.     char ret;
  62.     char title[TITLEN];
  63.     char buf[TITLEN];
  64.     RasterBlock far *gfxblk;
  65.     RasterBlock far *gfxblk2;
  66.     RasterBlock far *spritebkgnd;
  67.  
  68.     /*
  69.      * Set up the Title
  70.      */
  71.     sprintf(title,"DEMO 5: Block function and Sprites");
  72.     palset(pal,0,255);
  73.  
  74.     /*
  75.      * Show Block Get (draw some circles and "get a chunk of them")
  76.      */
  77.  
  78.     fillscreen(0);
  79.     setview(0,0,maxx,maxy);
  80.     drwstring(SET,7,0,title,10,0);
  81.     sprintf(buf,"blkget(x1,y1,x2,y2,GfxBlock);");
  82.     drwstring(SET,7,0,buf,10,16);
  83.     colr = 16;
  84.     for(i=0;i<=maxx/2;i++) {
  85.         drwcircle(SET,colr,maxx/4+i,maxy/2,maxy/5);
  86.         colr+=2;
  87.         if(colr>255)
  88.             colr = 16;
  89.     }
  90.  
  91.     xinc = maxx/20;
  92.     yinc = maxy/20;
  93.     x1 = maxx/2-xinc;
  94.     y1 = maxy/2-yinc;
  95.     x2 = maxx/2+xinc;
  96.     y2 = maxy/2+yinc;
  97.     i = (x2-x1+1)*(y2-y1+1)+4;
  98.     gfxblk = _fmalloc(i);
  99.     if (!gfxblk) {
  100.         restext();
  101.         printf("ERROR: Allocating memory for gfxblk: %d bytes\n",i);
  102.         exit(1);
  103.     }
  104.     drwbox(SET,0,x1,y1,x2,y2);
  105.     blkget(x1,y1,x2,y2,gfxblk);
  106.  
  107.     ret = getkey();
  108.     if ((ret == 's') || (ret == 'q')) {
  109.         fillscreen(0);
  110.         _ffree(gfxblk);
  111.         return(ret);
  112.     }
  113.  
  114.     /*
  115.      * Show Block Rotate and Sprite Stuff
  116.      */
  117.     drwstring(SET,7,0,title,10,0);
  118.     sprintf(buf,"blkrotate(angle,backfill,GfxBlockSrc,GfxBlockDst);");
  119.     drwstring(SET,7,0,buf,10,16);
  120.     sprintf(buf,"spritegap(transcolor,x,y,SpriteArray,BkGndArray);");
  121.     drwstring(SET,7,0,buf,10,32);
  122.     sprintf(buf,"spriteput(transcolor,x,y,SpriteArray);");
  123.     drwstring(SET,7,0,buf,10,48);
  124.     cntx = (x2-x1) / 2 + x1;
  125.     cnty = (y2-y1) / 2 + y1;
  126.     fillarea(x1+2,y1+2,0,0);
  127.     i = blkrotatesize(45,gfxblk);
  128.     spritebkgnd = _fmalloc(i);
  129.     if (!spritebkgnd) {
  130.         restext();
  131.         printf("ERROR: Allocating memory for spritebkgnd: %d bytes\n",i);
  132.         exit(1);
  133.     }
  134.     gfxblk2 = _fmalloc(i);
  135.     if (!gfxblk2) {
  136.         restext();
  137.         printf("ERROR: Allocating memory for gfxblk2: %d bytes\n",i);
  138.         exit(1);
  139.     }
  140.     blkget(x1,y1,x2,y2,spritebkgnd);
  141.     setview(0,64,maxx,maxy);
  142.  
  143.     for(i=0;i<=360;i+=4) {
  144.         blkrotate(i,1,gfxblk,gfxblk2);
  145.         spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  146.         spritegap(1,cntx-(gfxblk2->width)/2,cnty-(gfxblk2->height)/2,gfxblk2,spritebkgnd);
  147.         sdelay(4);
  148.     }
  149.     spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  150.     blkput(SET,x1,y1,gfxblk);
  151.  
  152.     setview(0,0,maxx,maxy);
  153.     ret = getkey();
  154.     if ((ret == 's') || (ret == 'q')) {
  155.         fillscreen(0);
  156.         palset(pal,16,255);
  157.         _ffree(gfxblk);
  158.         _ffree(gfxblk2);
  159.         _ffree(spritebkgnd);
  160.         return(ret);
  161.     }
  162.  
  163.     /*
  164.      * Show Block Resize and Sprite Stuff
  165.      */
  166.     drwstring(SET,7,0,title,10,0);
  167.     sprintf(buf,"blkresize(Width,Height,GfxBlockSrc,GfxBlockDst);");
  168.     drwstring(SET,7,0,buf,10,16);
  169.     sprintf(buf,"spritegap(transcolor,x,y,SpriteArray,BkGndArray);");
  170.     drwstring(SET,7,0,buf,10,32);
  171.     sprintf(buf,"spriteput(transcolor,x,y,SpriteArray);");
  172.     drwstring(SET,7,0,buf,10,48);
  173.     fillarea(x1+2,y1+2,0,0);
  174.     blkget(x1,y1,x2,y2,spritebkgnd);
  175.     setview(0,64,maxx,maxy);
  176.  
  177.     i = (x2-x1+1+xinc)*(y2-y1+1+xinc)+4;
  178.  
  179.     spritebkgnd = _frealloc(spritebkgnd,i);
  180.     if (!spritebkgnd) {
  181.         restext();
  182.         printf("ERROR: reallocating memory for spritebkgnd: %d bytes\n",i);
  183.         exit(1);
  184.     }
  185.  
  186.     gfxblk2 = _frealloc(gfxblk2,i);
  187.     if (!gfxblk2) {
  188.         restext();
  189.         printf("ERROR: reallocating memory for gfxblk2: %d bytes\n",i);
  190.         exit(1);
  191.     }
  192.  
  193.     for(i=0;i<=xinc;i++) {
  194.         blkresize((gfxblk->width)-i,(gfxblk->height)-i,gfxblk,gfxblk2);
  195.         spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  196.         spritegap(1,cntx-(gfxblk2->width)/2,cnty-(gfxblk2->height)/2,gfxblk2,spritebkgnd);
  197.         sdelay(3);
  198.     }
  199.     spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  200.  
  201.     for(i=xinc;i>=0;i--) {
  202.         blkresize((gfxblk->width)-i,(gfxblk->height)-i,gfxblk,gfxblk2);
  203.         spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  204.         spritegap(1,cntx-(gfxblk2->width)/2,cnty-(gfxblk2->height)/2,gfxblk2,spritebkgnd);
  205.         sdelay(3);
  206.     }
  207.     spriteput(SET,1,cntx-(spritebkgnd->width)/2,cnty-(spritebkgnd->height)/2,spritebkgnd);
  208.     blkput(SET,x1,y1,gfxblk);
  209.  
  210.     ret = getkey();
  211.     if ((ret == 's') || (ret == 'q')) {
  212.         fillscreen(0);
  213.         palset(pal,16,255);
  214.         setview(0,0,maxx,maxy);
  215.         _ffree(gfxblk);
  216.         _ffree(gfxblk2);
  217.         _ffree(spritebkgnd);
  218.         return(ret);
  219.     }
  220.  
  221.  
  222.     /*
  223.      * Show Block Put (put the "chunks" randomly around the screen)
  224.      */
  225.     setview(0,16,maxx,32);
  226.     fillview(0);
  227.     sprintf(buf,"blkput(mode,x,y,GfxBlock);");
  228.     drwstring(SET,7,0,buf,10,16);
  229.     xinc = maxx/10;
  230.     yinc = maxy/10;
  231.     setview(0,32,maxx,maxy);
  232.     for(i=0;i<=maxx/2;i++) {
  233.         x1 = randnum(maxx + xinc) - xinc;
  234.         y1 = randnum(maxy + yinc) - yinc;
  235.         blkput(SET,x1,y1,gfxblk);
  236.     }
  237.  
  238.     _ffree(gfxblk);
  239.     _ffree(gfxblk2);
  240.     _ffree(spritebkgnd);
  241.     setview(0,0,maxx,maxy);
  242.     ret = getkey();
  243.     if ((ret == 's') || (ret == 'q')) {
  244.         fillscreen(0);
  245.         return(ret);
  246.     }
  247.  
  248.     return(ret);
  249.  
  250. }
  251.  
  252.  
  253.  
  254. /**********
  255.  * DOCLIP *
  256.  **********/
  257.  
  258. char doclip(void)
  259. {
  260.     struct dcoord {
  261.         int x1;
  262.         int x2;
  263.         int y1;
  264.         int y2;
  265.     };
  266.  
  267.     int i, j, k;
  268.     int xinc, x, y, x1, y1, x2, y2;
  269.     int xsub, radx, rady;
  270.     int wdth, hgth, spcingx, spcingy;
  271.     struct dcoord b[4];
  272.     char ret;
  273.     char title[TITLEN];
  274.     char buf[TITLEN];
  275.  
  276.     /*
  277.      * Set up the Title
  278.      */
  279.     sprintf(title,"DEMO 2: Clipping capability");
  280.     palset(pal,0,255);
  281.  
  282.     /*
  283.      * Set up the windows
  284.      */
  285.  
  286.     fillscreen(0);
  287.     setview(0,0,maxx,maxy);
  288.     drwstring(SET,7,0,title,10,0);
  289.     sprintf(buf,"All pimitives automatically clip");
  290.     drwstring(SET,7,0,buf,10,16);
  291.  
  292.     wdth = (maxx + 1) * 4 / 9;
  293.     spcingx = ((maxx + 1) - wdth * 2) / 3;
  294.     hgth = (maxy + 1 - 35) * 4 / 9;
  295.     spcingy = ((maxy + 1 - 35) - hgth * 2) / 3;
  296.     xinc = wdth * 3 / 2;
  297.     xsub = wdth / 4;
  298.  
  299.     b[0].x1 = spcingx;
  300.     b[0].x2 = b[0].x1 + wdth;
  301.     b[0].y1 = spcingy + 35;
  302.     b[0].y2 = b[0].y1 + hgth;
  303.  
  304.     b[1].x2 = maxx - spcingx;
  305.     b[1].x1 = b[1].x2 - wdth;
  306.     b[1].y1 = spcingy + 35;
  307.     b[1].y2 = b[1].y1 + hgth;
  308.  
  309.     b[2].x2 = maxx - spcingx;
  310.     b[2].x1 = b[2].x2 - wdth;
  311.     b[2].y2 = maxy - spcingy;
  312.     b[2].y1 = b[2].y2 - hgth;
  313.  
  314.     b[3].x1 = spcingx;
  315.     b[3].x2 = b[3].x1 + wdth;
  316.     b[3].y2 = maxy - spcingy;
  317.     b[3].y1 = b[3].y2 - hgth;
  318.  
  319.     for(i=0;i<4;i++)
  320.         drwbox(SET,15,b[i].x1++,b[i].y1++,b[i].x2--,b[i].y2--);
  321.  
  322.     /*
  323.      * Show the clipping
  324.      */
  325.     for(i=0;i<=maxx/6;i++)
  326.         for(j=0;j<4;j++) {
  327.             setview(b[j].x1,b[j].y1,b[j].x2,b[j].y2);
  328.             switch (j) {
  329.                 case 0:
  330.                     for(k=0;k<6;k++) {
  331.                         x = b[j].x1 + randnum(xinc) - xsub;
  332.                         y = b[j].y1 + randnum(xinc) - xsub;
  333.                         drwpoint(SET,randnum(16),x,y);
  334.                     }
  335.                     break;
  336.                 case 1:
  337.                     x1 = b[j].x1 + randnum(xinc) - xsub;
  338.                     y1 = b[j].y1 + randnum(xinc) - xsub;
  339.                     x2 = b[j].x1 + randnum(xinc) - xsub;
  340.                     y2 = b[j].y1 + randnum(xinc) - xsub;
  341.                     drwline(SET,randnum(16),x1,y1,x2,y2);
  342.                     break;
  343.                 case 2:
  344.                     x = b[j].x1 + randnum(xinc) - xsub;
  345.                     y = b[j].y1 + randnum(xinc) - xsub;
  346.                     radx = randnum(wdth) / 2;
  347.                     drwcircle(SET,randnum(16),x,y,radx);
  348.                     break;
  349.                 case 3:
  350.                     x = b[j].x1 + randnum(xinc) - xsub;
  351.                     y = b[j].y1 + randnum(xinc) - xsub;
  352.                     radx = randnum(wdth) / 2;
  353.                     rady = randnum(wdth) / 2;
  354.                     drwellipse(SET,randnum(16),x,y,radx,rady);
  355.                     break;
  356.             }
  357.         }
  358.  
  359.     setview(0,0,maxx,maxy);
  360.  
  361.     ret = getkey();
  362.  
  363.     return(ret);
  364.  
  365. }
  366.  
  367. /**********
  368.  * DOFILL *
  369.  **********/
  370.  
  371. char dofill(void)
  372. {
  373.     struct dcoord {
  374.         int x1;
  375.         int x2;
  376.         int y1;
  377.         int y2;
  378.     };
  379.  
  380.     int i, colr;
  381.     int x, y;
  382.     int radx, rady;
  383.     int wdth, hgth, spcingx, spcingy;
  384.     struct dcoord b[4];
  385.     char ret;
  386.     char title[TITLEN];
  387.     char buf[TITLEN];
  388.  
  389.     /*
  390.      * Set up the Title
  391.      */
  392.     sprintf(title,"DEMO 3: Filling functions");
  393.     palset(pal,0,255);
  394.  
  395.     /*
  396.      * Set up the windows
  397.      */
  398.  
  399.     fillscreen(10);
  400.     setview(0,0,maxx,maxy);
  401.     drwstring(SET,7,0,title,10,0);
  402.     sprintf(buf,"fillscreen(color);");
  403.     drwstring(SET,7,0,buf,10,16);
  404.  
  405.     ret = getkey();
  406.     if ((ret == 's') || (ret == 'q'))
  407.         return(ret);
  408.  
  409.     /*
  410.      * Set up windows and show viewport fill
  411.      */
  412.     fillscreen(0);
  413.     drwstring(SET,7,0,title,10,0);
  414.     sprintf(buf,"fillview(color);");
  415.     drwstring(SET,7,0,buf,10,16);
  416.  
  417.     wdth = (maxx + 1) * 4 / 9;
  418.     spcingx = ((maxx + 1) - wdth * 2) / 3;
  419.     hgth = (maxy + 1 - 35) * 4 / 9;
  420.     spcingy = ((maxy + 1 - 35) - hgth * 2) / 3;
  421.  
  422.     b[0].x1 = spcingx;
  423.     b[0].x2 = b[0].x1 + wdth;
  424.     b[0].y1 = spcingy + 35;
  425.     b[0].y2 = b[0].y1 + hgth;
  426.  
  427.     b[1].x2 = maxx - spcingx;
  428.     b[1].x1 = b[1].x2 - wdth;
  429.     b[1].y1 = spcingy + 35;
  430.     b[1].y2 = b[1].y1 + hgth;
  431.  
  432.     b[2].x2 = maxx - spcingx;
  433.     b[2].x1 = b[2].x2 - wdth;
  434.     b[2].y2 = maxy - spcingy;
  435.     b[2].y1 = b[2].y2 - hgth;
  436.  
  437.     b[3].x1 = spcingx;
  438.     b[3].x2 = b[3].x1 + wdth;
  439.     b[3].y2 = maxy - spcingy;
  440.     b[3].y1 = b[3].y2 - hgth;
  441.  
  442.     for(i=0;i<4;i++)
  443.         drwbox(SET,15,b[i].x1++,b[i].y1++,b[i].x2--,b[i].y2--);
  444.  
  445.     ret = getkey();
  446.     if ((ret == 's') || (ret == 'q')) {
  447.         setview(0,0,maxx,maxy);
  448.         return(ret);
  449.     }
  450.  
  451.     /*
  452.      * Show the clipping
  453.      */
  454.     for(i=0;i<4;i++) {
  455.         setview(b[i].x1,b[i].y1,b[i].x2,b[i].y2);
  456.         fillview(i+10);
  457.     }
  458.  
  459.     setview(0,0,maxx,maxy);
  460.     ret = getkey();
  461.     if ((ret == 's') || (ret == 'q'))
  462.         return(ret);
  463.  
  464.     /*
  465.      * Set up windows and show area fill
  466.      */
  467.     fillscreen(0);
  468.     drwstring(SET,7,0,title,10,0);
  469.     sprintf(buf,"fillarea(xseed,yseed,bordercolor,fillcolor);");
  470.     drwstring(SET,7,0,buf,10,16);
  471.  
  472.     drwbox(SET,15,5,35,maxx-4,maxy-4);
  473.     setview(6,36,maxx-5,maxy-5);
  474.  
  475.     colr=1;
  476.     for(i=0;i<=maxx/10;i++) {
  477.         x = 50 + randnum(maxx-50);
  478.         y = 50 + randnum(maxy-50);
  479.         radx = 2 + randnum(maxx/20);
  480.         rady = 2 + randnum(maxy/20);
  481.         drwellipse(SET,colr++,x,y,radx,rady);
  482.         if (colr>9)
  483.             colr = 1;
  484.     }
  485.  
  486.     for(i=0;i<=maxx/15;i++) {
  487.         x = 50 + randnum(maxx-50);
  488.         y = 50 + randnum(maxy-50);
  489.         radx = 2 + randnum(maxx/20);
  490.         rady = 2 + randnum(maxy/20);
  491.         drwellipse(SET,12,x,y,radx,rady);
  492.     }
  493.  
  494.     ret = getkey();
  495.     if ((ret == 's') || (ret == 'q')) {
  496.         setview(0,0,maxx,maxy);
  497.         return(ret);
  498.     }
  499.  
  500.     fillarea(7,37,12,10);
  501.  
  502.     setview(0,0,maxx,maxy);
  503.     ret = getkey();
  504.     if ((ret == 's') || (ret == 'q'))
  505.         return(ret);
  506.  
  507.     /*
  508.      * Setup windows and show color fill
  509.      */
  510.     fillscreen(0);
  511.     drwstring(SET,7,0,title,10,0);
  512.     sprintf(buf,"fillcolor(xseed,yseed,oldcolor,fillcolor);");
  513.     drwstring(SET,7,0,buf,10,16);
  514.  
  515.     drwbox(SET,15,5,35,maxx-4,maxy-4);
  516.     setview(6,36,maxx-5,maxy-5);
  517.  
  518.     colr=1;
  519.     for(i=0;i<=maxx/10;i++) {
  520.         x = 50 + randnum(maxx-50);
  521.         y = 50 + randnum(maxy-50);
  522.         radx = 2 + randnum(maxx/20);
  523.         rady = 2 + randnum(maxy/20);
  524.         drwellipse(SET,colr++,x,y,radx,rady);
  525.         if (colr>9)
  526.             colr = 1;
  527.     }
  528.  
  529.     for(i=0;i<=maxx/15;i++) {
  530.         x = 50 + randnum(maxx-50);
  531.         y = 50 + randnum(maxy-50);
  532.         radx = 2 + randnum(maxx/20);
  533.         rady = 2 + randnum(maxy/20);
  534.         drwellipse(SET,12,x,y,radx,rady);
  535.     }
  536.  
  537.     ret = getkey();
  538.     if ((ret == 's') || (ret == 'q')) {
  539.         setview(0,0,maxx,maxy);
  540.         return(ret);
  541.     }
  542.  
  543.     fillcolor(7,37,0,10);
  544.  
  545.     setview(0,0,maxx,maxy);
  546.  
  547.     ret = getkey();
  548.  
  549.     return(ret);
  550.  
  551. }
  552.  
  553.  
  554. /*********
  555.  * DOPAL *
  556.  *********/
  557.  
  558. char dopal(void)
  559. {
  560.     int x1, x2, y1, y2;
  561.     int i, colr;
  562.     char ret;
  563.     char title[TITLEN];
  564.     char buf[TITLEN];
  565.  
  566.     /*
  567.      * Set up the Title
  568.      */
  569.     sprintf(title,"DEMO 4: Palette functions");
  570.     palset(orgpal,0,255);
  571.  
  572.     /*
  573.      * Show palette set/get
  574.      */
  575.  
  576.     fillscreen(0);
  577.     setview(0,0,maxx,maxy);
  578.     drwstring(SET,7,0,title,10,0);
  579.     sprintf(buf,"palget(pal,beg,end),palset(pal,beg,end)");
  580.     drwstring(SET,7,0,buf,10,16);
  581.  
  582.     colr = 16;
  583.     x1 = 10;
  584.     x2 = maxx - 9;
  585.     y1 = 35;
  586.     y2 = maxy - 9;
  587.     i = 0;
  588.     while (y1+i < y2-i) {
  589.         drwbox(SET,colr++,x1+i,y1+i,x2-i,y2-i);
  590.         if (colr>255)
  591.             colr = 16;
  592.         i++;
  593.     }
  594.     ret = getkey();
  595.     if ((ret == 's') || (ret == 'q')) {
  596.         fillscreen(0);
  597.         setview(0,0,maxx,maxy);
  598.         return(ret);
  599.     }
  600.     palset(pal,16,255);
  601.     ret = getkey();
  602.     if ((ret == 's') || (ret == 'q')) {
  603.         setview(0,0,maxx,maxy);
  604.         fillscreen(0);
  605.         return(ret);
  606.     }
  607.  
  608.     /*
  609.      * Show palette auto fade out/in
  610.      */
  611.     setview(0,16,maxx,32);
  612.     fillview(0);
  613.     sprintf(buf,"palioauto(pal,beg,end,speed);");
  614.     drwstring(SET,7,0,buf,10,16);
  615.     palioauto(pal,16,255,-2);
  616.     palioauto(pal,16,255,2);
  617.     ret = getkey();
  618.     if ((ret == 's') || (ret == 'q')) {
  619.         setview(0,0,maxx,maxy);
  620.         return(ret);
  621.     }
  622.  
  623.     /*
  624.      * Show palette auto fade to
  625.      */
  626.     setview(0,16,maxx,32);
  627.     fillview(0);
  628.     sprintf(buf,"palchgauto(pal,newpal,beg,end,speed);");
  629.     drwstring(SET,7,0,buf,10,16);
  630.     palchgauto(pal,pal2,16,255,2);
  631.     palchgauto(pal2,pal,16,255,2);
  632.     ret = getkey();
  633.     if ((ret == 's') || (ret == 'q')) {
  634.         setview(0,0,maxx,maxy);
  635.         return(ret);
  636.     }
  637.  
  638.     /*
  639.      * Show palette rotate
  640.      */
  641.     setview(0,16,maxx,32);
  642.     fillview(0);
  643.     sprintf(buf,"palrotate(pal,beg,end,shift);");
  644.     drwstring(SET,7,0,buf,10,16);
  645.     for(i=0;i<=240;i++) {
  646.         palrotate(pal,16,255,2);
  647.         palget(pal,16,255);
  648.     }
  649.     for(i=0;i<=120;i++) {
  650.         palrotate(pal,16,255,-8);
  651.         palget(pal,16,255);
  652.     }
  653.     ret = getkey();
  654.     if ((ret == 's') || (ret == 'q'))
  655.         setview(0,0,maxx,maxy);
  656.  
  657.     return(ret);
  658.  
  659. }
  660.  
  661.  
  662. /***********
  663.  * DOPRIMS *
  664.  ***********/
  665.  
  666. char doprims(void)
  667. {
  668.  
  669.     int x1, x2, y1, y2;
  670.     int maxrad, radx, rady;
  671.     int i, colr, num, sang, eang;
  672.     int ofst, intsbits, numlevels;
  673.     D2Point p1, off1, off2, p2;
  674.  
  675.     char ret;
  676.     char title[TITLEN];
  677.     char buf[TITLEN];
  678.     PaletteData pal;
  679.  
  680.     /*
  681.      * Set up the Title
  682.      */
  683.     sprintf(title,"DEMO 1: Primitives");
  684.     palset(orgpal,0,255);
  685.  
  686.     /*
  687.      * Draw some points
  688.      */
  689.  
  690.     fillscreen(0);
  691.     setview(0,0,maxx,maxy);
  692.     drwstring(SET,7,0,title,10,0);
  693.     sprintf(buf,"drwpoint(mode,color,x,y);");
  694.     drwstring(SET,7,0,buf,10,16);
  695.     setview(0,32,maxx,maxy);
  696.     colr = 1;
  697.     num = maxx * 2;
  698.     for(i=0;i<num;i++) {
  699.         x1 = randnum(maxx);
  700.         y1 = randnum(maxy);
  701.         drwpoint(SET,colr++,x1,y1);
  702.         if (colr>15)
  703.             colr = 1;
  704.     }
  705.     setview(0,0,maxx,maxy);
  706.     ret = getkey();
  707.     if ((ret=='s') || (ret=='q'))
  708.         return(ret);
  709.  
  710.     /*
  711.      * Draw some lines
  712.      */
  713.     fillscreen(0);
  714.     setview(0,0,maxx,maxy);
  715.     drwstring(SET,7,0,title,10,0);
  716.     sprintf(buf,"drwline(mode,color,x1,y1,x2,y2);");
  717.     drwstring(SET,7,0,buf,10,16);
  718.     setview(0,32,maxx,maxy);
  719.     colr = 1;
  720.     num = maxx / 6;
  721.  
  722.     for(i=0;i<num;i++) {
  723.         x1 = randnum(maxx);
  724.         y1 = randnum(maxy);
  725.         x2 = randnum(maxx);
  726.         y2 = randnum(maxy);
  727.         drwline(SET,colr++,x1,y1,x2,y2);
  728.         if (colr>15)
  729.             colr = 1;
  730.     }
  731.     setview(0,0,maxx,maxy);
  732.     ret = getkey();
  733.     if ((ret=='s') || (ret=='q'))
  734.         return(ret);
  735.  
  736.     /*
  737.      * Draw some antialiased lines
  738.      */
  739.     fillscreen(0);
  740.     setview(0,0,maxx,maxy);
  741.     drwstring(SET,7,0,title,10,0);
  742.     sprintf(buf,"drwaline(colorbits,color,x1,y1,x2,y2);  [antialised lines]");
  743.     drwstring(SET,7,0,buf,10,16);
  744.     setview(0,32,maxx,maxy);
  745.     num = maxx / 8;
  746.     intsbits = 3; /* provide 2^3=8 shades */
  747.     numlevels = 1 << intsbits;
  748.     palget(pal,0,255);
  749.     for (i=0;i<numlevels;i++) {
  750.  
  751.         /* do not shade completely to zero:  colors range from 63 - 28 */
  752.  
  753.         /* blue */
  754.         ofst = 128 + numlevels * 0 + i;
  755.         pal[ofst].r = 0;
  756.         pal[ofst].g = 0;
  757.         pal[ofst].b = (char)(63-35*i/(numlevels-1));
  758.  
  759.         /* green */
  760.         ofst = 128 + numlevels * 1 + i;
  761.         pal[ofst].r = 0;
  762.         pal[ofst].g = (char)(63-35*i/(numlevels-1));
  763.         pal[ofst].b = 0;
  764.  
  765.         /* cyan */
  766.         ofst = 128 + numlevels * 2 + i;
  767.         pal[ofst].r = 0;
  768.         pal[ofst].g = (char)(63-35*i/(numlevels-1));
  769.         pal[ofst].b = (char)(63-35*i/(numlevels-1));
  770.  
  771.         /* red */
  772.         ofst = 128 + numlevels * 3 + i;
  773.         pal[ofst].r = (char)(63-35*i/(numlevels-1));
  774.         pal[ofst].g = 0;
  775.         pal[ofst].b = 0;
  776.  
  777.         /* magenta */
  778.         ofst = 128 + numlevels * 4 + i;
  779.         pal[ofst].r = (char)(63-35*i/(numlevels-1));
  780.         pal[ofst].g = 0;
  781.         pal[ofst].b = (char)(63-35*i/(numlevels-1));
  782.  
  783.         /* yellow */
  784.         ofst = 128 + numlevels * 5 + i;
  785.         pal[ofst].r = (char)(63-35*i/(numlevels-1));
  786.         pal[ofst].g = (char)(63-35*i/(numlevels-1));
  787.         pal[ofst].b = 0;
  788.  
  789.         /* white */
  790.         ofst = 128 + numlevels * 6 + i;
  791.         pal[ofst].r = (char)(63-35*i/(numlevels-1));
  792.         pal[ofst].g = (char)(63-35*i/(numlevels-1));
  793.         pal[ofst].b = (char)(63-35*i/(numlevels-1));
  794.  
  795.     }
  796.     palset(pal,0,255);
  797.     colr = 0;
  798.     for(i=0;i<num;i++) {
  799.         x1 = randnum(maxx);
  800.         y1 = randnum(maxy);
  801.         x2 = randnum(maxx);
  802.         y2 = randnum(maxy);
  803.         drwaline(intsbits,128+colr*numlevels,x1,y1,x2,y2);
  804.         colr++;
  805.         if (colr>6)
  806.             colr = 0;
  807.     }
  808.     setview(0,0,maxx,maxy);
  809.     ret = getkey();
  810.     palset(orgpal,0,255);
  811.     if ((ret=='s') || (ret=='q'))
  812.         return(ret);
  813.  
  814.  
  815.     /*
  816.      * Draw some boxes
  817.      */
  818.     fillscreen(0);
  819.     setview(0,0,maxx,maxy);
  820.     drwstring(SET,7,0,title,10,0);
  821.     sprintf(buf,"drwbox(mode,color,x1,y1,x2,y2);");
  822.     drwstring(SET,7,0,buf,10,16);
  823.     setview(0,32,maxx,maxy);
  824.     colr = 1;
  825.     num = maxx / 10;
  826.     for(i=0;i<num;i++) {
  827.         x1 = randnum(maxx);
  828.         y1 = randnum(maxy);
  829.         x2 = randnum(maxx);
  830.         y2 = randnum(maxy);
  831.         drwbox(SET,colr++,x1,y1,x2,y2);
  832.         if (colr>15)
  833.             colr = 1;
  834.     }
  835.     setview(0,0,maxx,maxy);
  836.     ret = getkey();
  837.     if ((ret=='s') || (ret=='q'))
  838.         return(ret);
  839.  
  840.     /*
  841.      * Draw some filled boxes
  842.      */
  843.     fillscreen(0);
  844.     setview(0,0,maxx,maxy);
  845.     drwstring(SET,7,0,title,10,0);
  846.     sprintf(buf,"drwfillbox(mode,color,x1,y1,x2,y2);");
  847.     drwstring(SET,7,0,buf,10,16);
  848.     setview(0,32,maxx,maxy);
  849.     colr = 1;
  850.     num = maxx / 15;
  851.     for(i=0;i<num;i++) {
  852.         x1 = randnum(maxx);
  853.         y1 = randnum(maxy);
  854.         x2 = randnum(maxx);
  855.         y2 = randnum(maxy);
  856.         drwfillbox(SET,colr++,x1,y1,x2,y2);
  857.         if (colr>15)
  858.             colr = 1;
  859.     }
  860.     setview(0,0,maxx,maxy);
  861.     ret = getkey();
  862.     if ((ret=='s') || (ret=='q'))
  863.         return(ret);
  864.  
  865.     /*
  866.      * Draw some circles
  867.      */
  868.     fillscreen(0);
  869.     setview(0,0,maxx,maxy);
  870.     drwstring(SET,7,0,title,10,0);
  871.     sprintf(buf,"drwcircle(mode,color,cx,cy,radius);");
  872.     drwstring(SET,7,0,buf,10,16);
  873.     setview(0,32,maxx,maxy);
  874.     colr = 1;
  875.     num = maxx / 20;
  876.     maxrad = maxx / 2;
  877.     for(i=0;i<num;i++) {
  878.         x1 = randnum(maxx);
  879.         y1 = randnum(maxy);
  880.         radx = randnum(maxrad);
  881.         drwcircle(SET,colr++,x1,y1,radx);
  882.         if (colr>15)
  883.             colr = 1;
  884.     }
  885.     setview(0,0,maxx,maxy);
  886.     ret = getkey();
  887.     if ((ret=='s') || (ret=='q'))
  888.         return(ret);
  889.  
  890.     /*
  891.      * Draw some filled circles
  892.      */
  893.     fillscreen(0);
  894.     setview(0,0,maxx,maxy);
  895.     drwstring(SET,7,0,title,10,0);
  896.     sprintf(buf,"drwfillcircle(mode,color,cx,cy,radius);");
  897.     drwstring(SET,7,0,buf,10,16);
  898.     setview(0,32,maxx,maxy);
  899.     colr = 1;
  900.     num = maxx / 25;
  901.     maxrad = maxx / 2;
  902.     for(i=0;i<num;i++) {
  903.         x1 = randnum(maxx);
  904.         y1 = randnum(maxy);
  905.         radx = randnum(maxrad);
  906.         drwfillcircle(SET,colr++,x1,y1,radx);
  907.         if (colr>15)
  908.             colr = 1;
  909.     }
  910.     setview(0,0,maxx,maxy);
  911.     ret = getkey();
  912.     if ((ret=='s') || (ret=='q'))
  913.         return(ret);
  914.  
  915.     /*
  916.      * Draw some ellipses
  917.      */
  918.     fillscreen(0);
  919.     setview(0,0,maxx,maxy);
  920.     drwstring(SET,7,0,title,10,0);
  921.     sprintf(buf,"drwellipse(mode,color,cx,cy,radiusx,radiusy);");
  922.     drwstring(SET,7,0,buf,10,16);
  923.     setview(0,32,maxx,maxy);
  924.     colr = 1;
  925.     num = maxx / 20;
  926.     maxrad = maxx / 2;
  927.     for(i=0;i<num;i++) {
  928.         x1 = randnum(maxx);
  929.         y1 = randnum(maxy);
  930.         radx = randnum(maxrad);
  931.         rady = randnum(maxrad);
  932.         drwellipse(SET,colr++,x1,y1,radx,rady);
  933.         if (colr>15)
  934.             colr = 1;
  935.     }
  936.     setview(0,0,maxx,maxy);
  937.     ret = getkey();
  938.  
  939.  
  940.     /*
  941.      * Draw some filled ellipses
  942.      */
  943.     fillscreen(0);
  944.     setview(0,0,maxx,maxy);
  945.     drwstring(SET,7,0,title,10,0);
  946.     sprintf(buf,"drwfillellipse(mode,color,cx,cy,radiusx,radiusy);");
  947.     drwstring(SET,7,0,buf,10,16);
  948.     setview(0,32,maxx,maxy);
  949.     colr = 1;
  950.     num = maxx / 25;
  951.     maxrad = maxx / 2;
  952.     for(i=0;i<num;i++) {
  953.         x1 = randnum(maxx);
  954.         y1 = randnum(maxy);
  955.         radx = randnum(maxrad);
  956.         rady = randnum(maxrad);
  957.         drwfillellipse(SET,colr++,x1,y1,radx,rady);
  958.         if (colr>15)
  959.             colr = 1;
  960.     }
  961.     setview(0,0,maxx,maxy);
  962.     ret = getkey();
  963.     if ((ret=='s') || (ret=='q'))
  964.         return(ret);
  965.  
  966.  
  967.     /*
  968.      * Draw some circular arcs
  969.      */
  970.     fillscreen(0);
  971.     setview(0,0,maxx,maxy);
  972.     drwstring(SET,7,0,title,10,0);
  973.     sprintf(buf,"drwcirarc(mode,color,cx,cy,radius,startang,endang);");
  974.     drwstring(SET,7,0,buf,10,16);
  975.     setview(0,32,maxx,maxy);
  976.     colr = 1;
  977.     num = maxx / 20;
  978.     maxrad = maxx / 2;
  979.     for(i=0;i<num;i++) {
  980.         x1 = randnum(maxx);
  981.         y1 = randnum(maxy);
  982.         radx = randnum(maxrad);
  983.         sang = randnum(360);
  984.         eang = randnum(360) + sang;
  985.         drwcirarc(SET,colr++,x1,y1,radx,sang,eang);
  986.         if (colr>15)
  987.             colr = 1;
  988.     }
  989.     setview(0,0,maxx,maxy);
  990.     ret = getkey();
  991.     if ((ret=='s') || (ret=='q'))
  992.         return(ret);
  993.  
  994.  
  995.     /*
  996.      * Draw some elliptical arcs
  997.      */
  998.     fillscreen(0);
  999.     setview(0,0,maxx,maxy);
  1000.     drwstring(SET,7,0,title,10,0);
  1001.     sprintf(buf,"drwellarc(mode,color,cx,cy,radiusx,radiusy,startang,endang);");
  1002.     drwstring(SET,7,0,buf,10,16);
  1003.     setview(0,32,maxx,maxy);
  1004.     colr = 1;
  1005.     num = maxx / 20;
  1006.     maxrad = maxx / 2;
  1007.     for(i=0;i<num;i++) {
  1008.         x1 = randnum(maxx);
  1009.         y1 = randnum(maxy);
  1010.         radx = randnum(maxrad);
  1011.         rady = randnum(maxrad);
  1012.         sang = randnum(360);
  1013.         eang = randnum(360) + sang;
  1014.         drwellarc(SET,colr++,x1,y1,radx,rady,sang,eang);
  1015.         if (colr>15)
  1016.             colr = 1;
  1017.     }
  1018.     setview(0,0,maxx,maxy);
  1019.     ret = getkey();
  1020.     if ((ret=='s') || (ret=='q'))
  1021.         return(ret);
  1022.  
  1023.  
  1024.     /*
  1025.      * Draw some cubic bezier curves
  1026.      */
  1027.     fillscreen(0);
  1028.     setview(0,0,maxx,maxy);
  1029.     drwstring(SET,7,0,title,10,0);
  1030.     sprintf(buf,"drwcubicbezier(mode,color,pon1,poff1,poff2,pon2);");
  1031.     drwstring(SET,7,0,buf,10,16);
  1032.     setview(0,32,maxx,maxy);
  1033.     colr = 1;
  1034.     num = maxx / 20;
  1035.     for(i=0;i<num;i++) {
  1036.         p1.x = randnum(maxx);
  1037.         p1.y = randnum(maxy);
  1038.         off1.x = randnum(maxx);
  1039.         off1.y = randnum(maxy);
  1040.         off2.x = randnum(maxx);
  1041.         off2.y = randnum(maxy);
  1042.         p2.x = randnum(maxx);
  1043.         p2.y = randnum(maxy);
  1044.         drwcubicbezier(SET,colr++,&p1,&off1,&off2,&p2);
  1045.         if (colr>15)
  1046.             colr = 1;
  1047.     }
  1048.     setview(0,0,maxx,maxy);
  1049.     ret = getkey();
  1050.     return(ret);
  1051.  
  1052. }
  1053.  
  1054.  
  1055. /************
  1056.  * DOSCROLL *
  1057.  ************/
  1058.  
  1059. char doscroll(void)
  1060. {
  1061.     int i, j, colr, num, totnum;
  1062.     int a, b, c, d;
  1063.     int x1, x2, y1, y2;
  1064.     int spcing, skip;
  1065.     long numbanks, numpages, banksperpage;
  1066.     char ret;
  1067.     char title[TITLEN];
  1068.     char buf[TITLEN];
  1069.     char buf2[TITLEN];
  1070.  
  1071.     /*
  1072.      * Set up the Title
  1073.      */
  1074.     sprintf(title,"DEMO 7: Scroll functions");
  1075.     palset(pal,0,255);
  1076.     fillscreen(0);
  1077.     setview(0,0,maxx,maxy);
  1078.     drwstring(SET,7,0,title,10,0);
  1079.  
  1080.     spcing = (maxy - 32) / 5;
  1081.     x1 = (maxx + 1) / 2 - spcing;
  1082.     y1 = (maxy + 1 - 32) / 2 + 32 - spcing;
  1083.     x2 = (maxx + 1) / 2 + spcing;
  1084.     y2 = (maxy + 1 - 32) / 2 + 32 + spcing;
  1085.     skip = spcing / 15;
  1086.     num = spcing / skip;
  1087.     if (spcing / 2 != (float)spcing / 2.)
  1088.         spcing++;
  1089.  
  1090.  
  1091.     drwbox(SET,12,x1++,y1++,x2--,y2--);
  1092.     colr = 16;
  1093.     sprintf(buf2,"TEXT text TEXT");
  1094.  
  1095.     /*
  1096.      * Show scrollup
  1097.      */
  1098.     setview(0,16,maxx,maxy);
  1099.     sprintf(buf,"scrollup(x1,y1,x2,y2,numlines,fillcolor);");
  1100.     drwstring(SET,7,0,buf,10,16);
  1101.     setview(x1,y1,x2,y2);
  1102.     fillview(0);
  1103.     totnum = maxx / 10;
  1104.     for(i=0;i<totnum;i++) {
  1105.         a = randnum(maxx);
  1106.         b = randnum(maxy);
  1107.         c = randnum(maxx);
  1108.         d = randnum(maxy);
  1109.         drwline(SET,colr,a,b,c,d);
  1110.         colr += 3;
  1111.         if (colr > 255)
  1112.             colr = 16;
  1113.     }
  1114.     drwstring(SET,7,0,buf2,x1+spcing,y1+spcing);
  1115.     drwstringlt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1116.     drwstringrt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1117.     drwstringdn(SET,7,0,buf2,x1+spcing,y1+spcing);
  1118.  
  1119.     for(i=0;i<num;i++)
  1120.         scrollup(x1,y1,x2,y2,skip,0);
  1121.  
  1122.     ret = getkey();
  1123.     if ((ret=='s') || (ret=='q'))
  1124.         return(ret);
  1125.  
  1126.     /*
  1127.      * Show scrolllt
  1128.      */
  1129.     setview(0,16,maxx,maxy);
  1130.     sprintf(buf,"scrolllt(x1,y1,x2,y2,numlines,fillcolor);");
  1131.     drwstring(SET,7,0,buf,10,16);
  1132.     setview(x1,y1,x2,y2);
  1133.     fillview(0);
  1134.     totnum = maxx / 10;
  1135.     for(i=0;i<totnum;i++) {
  1136.         a = randnum(maxx);
  1137.         b = randnum(maxy);
  1138.         c = randnum(maxx);
  1139.         d = randnum(maxy);
  1140.         drwline(SET,colr,a,b,c,d);
  1141.         colr += 3;
  1142.         if (colr > 255)
  1143.             colr = 16;
  1144.     }
  1145.     drwstring(SET,7,0,buf2,x1+spcing,y1+spcing);
  1146.     drwstringlt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1147.     drwstringrt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1148.     drwstringdn(SET,7,0,buf2,x1+spcing,y1+spcing);
  1149.  
  1150.     for(i=0;i<num;i++)
  1151.         scrolllt(x1,y1,x2,y2,skip,0);
  1152.  
  1153.     ret = getkey();
  1154.     if ((ret=='s') || (ret=='q'))
  1155.         return(ret);
  1156.  
  1157.     /*
  1158.      * Show scrolldn
  1159.      */
  1160.     setview(0,16,maxx,maxy);
  1161.     sprintf(buf,"scrolldn(x1,y1,x2,y2,numlines,fillcolor);");
  1162.     drwstring(SET,7,0,buf,10,16);
  1163.     setview(x1,y1,x2,y2);
  1164.     fillview(0);
  1165.     totnum = maxx / 10;
  1166.     for(i=0;i<totnum;i++) {
  1167.         a = randnum(maxx);
  1168.         b = randnum(maxy);
  1169.         c = randnum(maxx);
  1170.         d = randnum(maxy);
  1171.         drwline(SET,colr,a,b,c,d);
  1172.         colr += 3;
  1173.         if (colr > 255)
  1174.             colr = 16;
  1175.     }
  1176.     drwstring(SET,7,0,buf2,x1+spcing,y1+spcing);
  1177.     drwstringlt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1178.     drwstringrt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1179.     drwstringdn(SET,7,0,buf2,x1+spcing,y1+spcing);
  1180.  
  1181.     for(i=0;i<num;i++)
  1182.         scrolldn(x1,y1,x2,y2,skip,0);
  1183.  
  1184.     ret = getkey();
  1185.     if ((ret=='s') || (ret=='q'))
  1186.         return(ret);
  1187.  
  1188.     /*
  1189.      * Show scrollrt
  1190.      */
  1191.     setview(0,16,maxx,maxy);
  1192.     sprintf(buf,"scrollrt(x1,y1,x2,y2,numlines,fillcolor);");
  1193.     drwstring(SET,7,0,buf,10,16);
  1194.     setview(x1,y1,x2,y2);
  1195.     fillview(0);
  1196.     totnum = maxx / 10;
  1197.     for(i=0;i<totnum;i++) {
  1198.         a = randnum(maxx);
  1199.         b = randnum(maxy);
  1200.         c = randnum(maxx);
  1201.         d = randnum(maxy);
  1202.         drwline(SET,colr,a,b,c,d);
  1203.         colr += 3;
  1204.         if (colr > 255)
  1205.             colr = 16;
  1206.     }
  1207.     drwstring(SET,7,0,buf2,x1+spcing,y1+spcing);
  1208.     drwstringlt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1209.     drwstringrt(SET,7,0,buf2,x1+spcing,y1+spcing);
  1210.     drwstringdn(SET,7,0,buf2,x1+spcing,y1+spcing);
  1211.  
  1212.     for(i=0;i<num;i++)
  1213.         scrollrt(x1,y1,x2,y2,skip,0);
  1214.  
  1215.     ret = getkey();
  1216.     if ((ret=='s') || (ret=='q'))
  1217.         return(ret);
  1218.  
  1219.     /*
  1220.      * Show paging
  1221.      */
  1222.      setview(0,0,maxx,maxy);
  1223.  
  1224.     /*
  1225.      * check to see if card supports changing the diplay offset
  1226.      */
  1227.  
  1228.     if (pagedisplay(0,0,0) == 0) {
  1229.         fillscreen(0);
  1230.         drwstring(SET,7,0,title,10,0);
  1231.         sprintf(buf,"Sorry, This video card does not support");
  1232.         drwstring(SET,7,0,buf,10,16);
  1233.         sprintf(buf,"changing the display offset in this");
  1234.         drwstring(SET,7,0,buf,10,32);
  1235.         sprintf(buf,"video mode. Unable to do the paging demo.");
  1236.         drwstring(SET,7,0,buf,10,48);
  1237.         sprintf(buf,"Press a key...");
  1238.         drwstring(SET,7,0,buf,10,64);
  1239.         ret = getkey();
  1240.         fillscreen(0);
  1241.         return(ret);
  1242.      }
  1243.  
  1244.     /*
  1245.      * check to see if there is enough memory for multiple pages
  1246.      */
  1247.  
  1248.     numbanks = (long)(maxx + 1) * (long)(maxy + 1);
  1249.     banksperpage = numbanks / (long)65536;
  1250.     if(numbanks % 65536l)
  1251.         banksperpage++; /* round up if there is extra */
  1252.     numbanks = (long)whichmem() / (long)64;
  1253.     numpages = (numbanks / banksperpage) - 1;
  1254.  
  1255.     /*
  1256.      * limit total number of pages to 3 (0-2) for this demo
  1257.      */
  1258.  
  1259.     if (numpages >= 3)
  1260.         numpages = 2;
  1261.  
  1262.     if (numpages == 0) {
  1263.         fillscreen(0);
  1264.         drwstring(SET,7,0,title,10,0);
  1265.         sprintf(buf,"Sorry, this video card does not have enough video memory to");
  1266.         drwstring(SET,7,0,buf,10,16);
  1267.         sprintf(buf,"support multiple video pages in this video mode.");
  1268.         drwstring(SET,7,0,buf,10,32);
  1269.         sprintf(buf,"Press a key...");
  1270.         drwstring(SET,7,0,buf,10,48);
  1271.         ret = getkey();
  1272.         fillscreen(0);
  1273.         return(ret);
  1274.      }
  1275.  
  1276.  
  1277.     totnum = maxx / 6;
  1278.     fillscreen(0);
  1279.     for(i=0;i<=numpages;i++) {
  1280.         setview(0,0,maxx,maxy);
  1281.         pageactive(i);
  1282.         pagedisplay(0,0,i);
  1283.         fillpage(0);
  1284.         drwstring(SET,7,0,title,10,0);
  1285.         sprintf(buf,"pageactive(page)");
  1286.         drwstring(SET,7,0,buf,10,16);
  1287.         sprintf(buf,"pagedisplay(startx,starty,page)");
  1288.         drwstring(SET,7,0,buf,10,32);
  1289.         sprintf(buf,"This Is Page %d",i);
  1290.         for(j=0;j<20;j++)
  1291.             drwstring(SET,12+i,0,buf,10,50+j*16);
  1292.         setview(150,58,maxx-10,maxy-10);
  1293.         for(j=0;j<totnum;j++) {
  1294.             x1 = randnum(maxx);
  1295.             y1 = randnum(maxy);
  1296.             x2 = randnum(100);
  1297.             y2 = randnum(100);
  1298.             colr += 1;
  1299.             if (colr > 16)
  1300.                 colr = 1;
  1301.             switch (i) {
  1302.                 case 0:
  1303.                     drwfillcircle(SET,colr,x1,y1,x2);
  1304.                     break;
  1305.                 case 1:
  1306.                     drwline(SET,colr,x1,y1,x1+x2,y1+y2);
  1307.                     drwellipse(SET,colr,x1,y1,x2/4,y2/4);
  1308.                     break;
  1309.                 case 2:
  1310.                     drwfillbox(SET,colr,x1,y1,x1+x2,y1+y2);
  1311.                     break;
  1312.             }
  1313.         }
  1314.         drwbox(SET,15,150,58,maxx-10,maxy-10);
  1315.         sdelay(35);
  1316.     }
  1317.     pageactive(0);
  1318.     pagedisplay(0,0,0);
  1319.     ret = getkey();
  1320.     if ((ret=='s') || (ret=='q'))
  1321.         return(ret);
  1322.  
  1323.     for(j=0;j<2;j++) {
  1324.         for(i=0;i<=numpages;i++) {
  1325.             pagedisplay(0,0,i);
  1326.             sdelay(35);
  1327.         }
  1328.     }
  1329.     for(j=0;j<20;j++) {
  1330.         for(i=0;i<=numpages;i++) {
  1331.             pagedisplay(0,0,i);
  1332.             sdelay(1);
  1333.         }
  1334.     }
  1335.     pagedisplay(0,0,0);
  1336.     setview(0,0,maxx,maxy);
  1337.     ret = getkey();
  1338.     return(ret);
  1339.  
  1340. }
  1341.  
  1342.  
  1343. /**********
  1344.  * DOTEXT *
  1345.  **********/
  1346.  
  1347. char dotext(void)
  1348. {
  1349.     int i, colr;
  1350.     char ret;
  1351.     char title[TITLEN];
  1352.     char buf[TITLEN];
  1353.     char buf2[TITLEN];
  1354.  
  1355.     /*
  1356.      * Set up the Title
  1357.      */
  1358.     sprintf(title,"DEMO 6: Text functions");
  1359.     palset(pal,0,255);
  1360.  
  1361.     /*
  1362.      * Show alternate print directions
  1363.      */
  1364.     fillscreen(0);
  1365.     setview(0,0,maxx,maxy);
  1366.     drwstring(SET,7,0,title,10,0);
  1367.     sprintf(buf,"drwstring(mode,foregnd,bkgnd,string,x,y);");
  1368.     drwstring(SET,7,0,buf,10,16);
  1369.     setview(0,32,maxx,maxy);
  1370.     sprintf(buf2,"The Quick Brown Fox Jumped Over The Lazy Dog's Back! 0123456789");
  1371.     colr = 16;
  1372.     for(i=32;i<=maxy;i+=20) {
  1373.         drwstring(SET,colr,0,buf2,0,i);
  1374.         colr+=5;
  1375.         if (colr>255)
  1376.             colr = 16;
  1377.     }
  1378.     ret = getkey();
  1379.     if ((ret=='s') || (ret=='q')) {
  1380.         setview(0,0,maxx,maxy);
  1381.         fillscreen(0);
  1382.         return(ret);
  1383.     }
  1384.  
  1385.     fillview(0);
  1386.     setview(0,16,maxx,32);
  1387.     sprintf(buf,"drwstringlt(mode,foregnd,bkgnd,string,x,y);");
  1388.     drwstring(SET,7,0,buf,10,16);
  1389.     setview(0,32,maxx,maxy);
  1390.     colr = 16;
  1391.     for(i=0;i<=maxx;i+=20) {
  1392.         drwstringlt(SET,colr,0,buf2,i,maxy);
  1393.         colr+=5;
  1394.         if (colr>255)
  1395.             colr = 16;
  1396.     }
  1397.     ret = getkey();
  1398.     if ((ret=='s') || (ret=='q')) {
  1399.         setview(0,0,maxx,maxy);
  1400.         fillscreen(0);
  1401.         return(ret);
  1402.     }
  1403.  
  1404.     fillview(0);
  1405.     setview(0,16,maxx,32);
  1406.     sprintf(buf,"drwstringdn(mode,foregnd,bkgnd,string,x,y);");
  1407.     drwstring(SET,7,0,buf,10,16);
  1408.     setview(0,32,maxx,maxy);
  1409.     colr = 16;
  1410.     for(i=maxy;i>=32;i-=20) {
  1411.         drwstringdn(SET,colr,0,buf2,maxx,i);
  1412.         colr+=5;
  1413.         if (colr>255)
  1414.             colr = 16;
  1415.     }
  1416.     ret = getkey();
  1417.     if ((ret=='s') || (ret=='q')) {
  1418.         setview(0,0,maxx,maxy);
  1419.         fillscreen(0);
  1420.         return(ret);
  1421.     }
  1422.  
  1423.     fillview(0);
  1424.     setview(0,16,maxx,32);
  1425.     sprintf(buf,"drwstringrt(mode,foregnd,bkgnd,string,x,y);");
  1426.     drwstring(SET,7,0,buf,10,16);
  1427.     setview(0,32,maxx,maxy);
  1428.     colr = 16;
  1429.     for(i=maxx;i>=0;i-=20) {
  1430.         drwstringrt(SET,colr,0,buf2,i,32);
  1431.         colr+=5;
  1432.         if (colr>255)
  1433.             colr = 16;
  1434.     }
  1435.     ret = getkey();
  1436.     setview(0,0,maxx,maxy);
  1437.     fillscreen(0);
  1438.  
  1439.     return(ret);
  1440.  
  1441. }
  1442.  
  1443.